package org.convallaria.framework.common.constants.sys;

/**
 * 角色相关常量
 * 
 * 功能特性：
 * - 定义角色状态常量
 * - 定义数据范围常量
 * - 定义角色字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class RoleConstants {

    private RoleConstants() {
        // 防止实例化
    }

    // ==================== 角色状态常量 ====================

    /**
     * 角色正常状态
     */
    public static final String ROLE_STATUS_NORMAL = "0";

    /**
     * 角色停用状态
     */
    public static final String ROLE_STATUS_DISABLED = "1";

    // ==================== 数据范围常量 ====================

    /**
     * 全部数据权限
     */
    public static final String DATA_SCOPE_ALL = "1";

    /**
     * 自定数据权限
     */
    public static final String DATA_SCOPE_CUSTOM = "2";

    /**
     * 本部门数据权限
     */
    public static final String DATA_SCOPE_DEPT = "3";

    /**
     * 本部门及以下数据权限
     */
    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";

    // ==================== 角色字段长度限制 ====================

    /**
     * 角色名称最大长度
     */
    public static final int ROLE_NAME_MAX_LENGTH = 30;

    /**
     * 角色权限字符串最大长度
     */
    public static final int ROLE_KEY_MAX_LENGTH = 100;

    /**
     * 角色排序最小值
     */
    public static final int ROLE_SORT_MIN = 0;

    /**
     * 角色排序最大值
     */
    public static final int ROLE_SORT_MAX = 999;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    // ==================== 角色状态描述 ====================

    /**
     * 角色状态描述映射
     */
    public static final String[] ROLE_STATUS_DESCRIPTIONS = {
        "正常", "停用"
    };

    /**
     * 数据范围描述映射
     */
    public static final String[] DATA_SCOPE_DESCRIPTIONS = {
        "", "全部数据权限", "自定数据权限", "本部门数据权限", "本部门及以下数据权限"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认角色状态
     */
    public static final String DEFAULT_ROLE_STATUS = ROLE_STATUS_NORMAL;

    /**
     * 默认数据范围
     */
    public static final String DEFAULT_DATA_SCOPE = DATA_SCOPE_ALL;

    /**
     * 默认角色排序
     */
    public static final int DEFAULT_ROLE_SORT = 0;

    /**
     * 默认菜单树选择项关联显示
     */
    public static final boolean DEFAULT_MENU_CHECK_STRICTLY = true;

    /**
     * 默认部门树选择项关联显示
     */
    public static final boolean DEFAULT_DEPT_CHECK_STRICTLY = true;

    // ==================== 业务规则常量 ====================

    /**
     * 超级管理员角色键值
     */
    public static final String SUPER_ADMIN_ROLE_KEY = "admin";

    /**
     * 超级管理员角色名称
     */
    public static final String SUPER_ADMIN_ROLE_NAME = "超级管理员";

    /**
     * 普通用户角色键值
     */
    public static final String USER_ROLE_KEY = "user";

    /**
     * 普通用户角色名称
     */
    public static final String USER_ROLE_NAME = "普通用户";

    /**
     * 访客角色键值
     */
    public static final String GUEST_ROLE_KEY = "guest";

    /**
     * 访客角色名称
     */
    public static final String GUEST_ROLE_NAME = "访客";

    // ==================== 工具方法 ====================

    /**
     * 获取角色状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getRoleStatusDesc(String status) {
        if (ROLE_STATUS_NORMAL.equals(status)) {
            return ROLE_STATUS_DESCRIPTIONS[0];
        } else if (ROLE_STATUS_DISABLED.equals(status)) {
            return ROLE_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 获取数据范围描述
     * 
     * @param dataScope 数据范围值
     * @return 数据范围描述
     */
    public static String getDataScopeDesc(String dataScope) {
        if (dataScope == null || dataScope.isEmpty()) {
            return "未知";
        }
        
        try {
            int index = Integer.parseInt(dataScope);
            if (index >= 1 && index <= 4) {
                return DATA_SCOPE_DESCRIPTIONS[index];
            }
        } catch (NumberFormatException e) {
            // 忽略解析异常
        }
        
        return "未知";
    }

    /**
     * 验证角色状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidRoleStatus(String status) {
        return ROLE_STATUS_NORMAL.equals(status) || ROLE_STATUS_DISABLED.equals(status);
    }

    /**
     * 验证数据范围是否有效
     * 
     * @param dataScope 数据范围值
     * @return true=有效，false=无效
     */
    public static boolean isValidDataScope(String dataScope) {
        return DATA_SCOPE_ALL.equals(dataScope) 
            || DATA_SCOPE_CUSTOM.equals(dataScope) 
            || DATA_SCOPE_DEPT.equals(dataScope) 
            || DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope);
    }

    /**
     * 验证角色名称是否有效
     * 
     * @param roleName 角色名称
     * @return true=有效，false=无效
     */
    public static boolean isValidRoleName(String roleName) {
        if (roleName == null || roleName.trim().isEmpty()) {
            return false;
        }
        return roleName.length() <= ROLE_NAME_MAX_LENGTH;
    }

    /**
     * 验证角色权限字符串是否有效
     * 
     * @param roleKey 角色权限字符串
     * @return true=有效，false=无效
     */
    public static boolean isValidRoleKey(String roleKey) {
        if (roleKey == null || roleKey.trim().isEmpty()) {
            return false;
        }
        return roleKey.length() <= ROLE_KEY_MAX_LENGTH;
    }

    /**
     * 验证角色排序是否有效
     * 
     * @param roleSort 角色排序
     * @return true=有效，false=无效
     */
    public static boolean isValidRoleSort(Integer roleSort) {
        if (roleSort == null) {
            return false;
        }
        return roleSort >= ROLE_SORT_MIN && roleSort <= ROLE_SORT_MAX;
    }

    /**
     * 判断是否为超级管理员角色
     * 
     * @param roleKey 角色权限字符串
     * @return true=超级管理员，false=其他
     */
    public static boolean isSuperAdminRole(String roleKey) {
        return SUPER_ADMIN_ROLE_KEY.equals(roleKey);
    }

    /**
     * 判断是否为普通用户角色
     * 
     * @param roleKey 角色权限字符串
     * @return true=普通用户，false=其他
     */
    public static boolean isUserRole(String roleKey) {
        return USER_ROLE_KEY.equals(roleKey);
    }

    /**
     * 判断是否为访客角色
     * 
     * @param roleKey 角色权限字符串
     * @return true=访客，false=其他
     */
    public static boolean isGuestRole(String roleKey) {
        return GUEST_ROLE_KEY.equals(roleKey);
    }

    /**
     * 判断数据范围是否为全部数据权限
     * 
     * @param dataScope 数据范围
     * @return true=全部数据权限，false=其他
     */
    public static boolean isDataScopeAll(String dataScope) {
        return DATA_SCOPE_ALL.equals(dataScope);
    }

    /**
     * 判断数据范围是否为自定数据权限
     * 
     * @param dataScope 数据范围
     * @return true=自定数据权限，false=其他
     */
    public static boolean isDataScopeCustom(String dataScope) {
        return DATA_SCOPE_CUSTOM.equals(dataScope);
    }

    /**
     * 判断数据范围是否为本部门数据权限
     * 
     * @param dataScope 数据范围
     * @return true=本部门数据权限，false=其他
     */
    public static boolean isDataScopeDept(String dataScope) {
        return DATA_SCOPE_DEPT.equals(dataScope);
    }

    /**
     * 判断数据范围是否为本部门及以下数据权限
     * 
     * @param dataScope 数据范围
     * @return true=本部门及以下数据权限，false=其他
     */
    public static boolean isDataScopeDeptAndChild(String dataScope) {
        return DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope);
    }
}
